#include "Avatar.h"

const HashedString Avatar::type("Avatar");

const HashedString& Avatar::getResourceType() const
{
	return type;
}

HashedString& Avatar::Data::getName()
{
	return m_name;
}
Avatar::Data::AttributeMap_t& Avatar::Data::getValues()
{
	return m_values;
}
Avatar::Data::Vector_t& Avatar::Data::getChildren()
{
	return m_children;
}

Avatar::Data::Vector_t& Avatar::getComponents()
{
	return m_components;
}
bool Avatar::FromXML( tinyxml2::XMLElement* element )
{
	return FromXML(element, m_components);
}
bool Avatar::FromXML( tinyxml2::XMLElement* element, Avatar::Data::Vector_t& dataArray )
{
	for ( tinyxml2::XMLElement* subElement = element->FirstChildElement(); subElement != NULL; subElement = subElement->NextSiblingElement())
	{
		Pointer<Data> data = new Data();

		data->getName() = HashedString(subElement->Name());

		for (const tinyxml2::XMLAttribute* attribute = subElement->FirstAttribute(); attribute != NULL; attribute = attribute->Next())
		{
			data->getValues().insert(Data::AttributePair_t(HashedString(attribute->Name()), HashedString(attribute->Value())));
		}

		if (!FromXML(subElement, data->getChildren()))
			return false;

		dataArray.push_back(data);
	}
	return true;
}

bool Avatar::ToXML( tinyxml2::XMLPrinter &printer )
{
	return ToXML( printer, m_components );
}
bool Avatar::ToXML( tinyxml2::XMLPrinter &printer, Avatar::Data::Vector_t& dataArray )
{
	for (Data::Vector_t::iterator it = dataArray.begin(); it != dataArray.end(); ++it)
	{
		Data* data = (*it);

		printer.OpenElement(data->getName().getString().c_str());

		for (Data::AttributeMap_t::iterator attribute = data->getValues().begin(); attribute != data->getValues().end(); ++attribute)
		{
			printer.PushAttribute(attribute->first.getString().c_str(), attribute->second.getString().c_str());
		}

		if (!ToXML(printer, data->getChildren()))
			return false;

		printer.CloseElement();
	}

	return true;
}